#include <ExampleApplication.h>
#include <iostream>
using namespace std;


class SimpleExample : public ExampleApplication {
  public : void createScene() {

	const string CUBE_MESH = "cube.mesh";

	// Identificadores de los nodos y entidades que forman la escena
	const string CUBO_GRANDE = "cuboGrande";
	const string TRONCO = "tronco";
	const string PIERNA_COMPLETA = "piernaCompleta";
	const string PIERNA_ARRIBA = "piernaArriba";
	const string PIERNA_ABAJO = "piernaAbajo";
	const string BRAZO_DERECHO = "brazoDerecho";
	const string BRAZO_IZQUIERDO = "brazoIzquierdo";
	const string CABEZA = "cabeza";
	const string BASE_SOMBRERO = "baseSombrero";
	const string SOMBRERO = "sombrero";

    SceneNode* cuboGrande = mSceneMgr->createSceneNode(CUBO_GRANDE);
    Entity *entcuboGrande = mSceneMgr->createEntity(CUBO_GRANDE, CUBE_MESH);
    cuboGrande->attachObject(entcuboGrande);
    mSceneMgr->getRootSceneNode()->addChild(cuboGrande);
    cuboGrande->setScale(50,50,50);
    cuboGrande->roll(Radian(Math::PI/4.0)); // Z
    cuboGrande->pitch(Radian(Math::PI/12.0)); // X
    cuboGrande->yaw(-Radian(Math::PI/3.0)); // Y

    SceneNode* tronco = mSceneMgr->createSceneNode(TRONCO);
    Entity *entTronco = mSceneMgr->createEntity(TRONCO, CUBE_MESH);
    tronco->attachObject(entTronco);
    mSceneMgr->getRootSceneNode()->addChild(tronco);
    tronco->setPosition(-100,-20, 100);
    tronco->setScale(5,20,5);
    tronco->roll(Radian(Math::PI/8.0)); // Z
    tronco->yaw(Radian(Math::PI/4.0)); // Y

    SceneNode* piernaCompleta = mSceneMgr->createSceneNode(PIERNA_COMPLETA);
    Entity *entPiernaCompleta = mSceneMgr->createEntity(PIERNA_COMPLETA, CUBE_MESH);
    piernaCompleta->attachObject(entPiernaCompleta);
    tronco->addChild(piernaCompleta);
    piernaCompleta->setPosition(-4,-1.75,0);
    piernaCompleta->setScale(0.5,1,0.5);
    piernaCompleta->roll(-Radian(Math::PI/4.0)); // Z

    SceneNode* piernaArriba = mSceneMgr->createSceneNode(PIERNA_ARRIBA);
    Entity *entpiernaArriba = mSceneMgr->createEntity(PIERNA_ARRIBA, CUBE_MESH);
    piernaArriba->attachObject(entpiernaArriba);
    tronco->addChild(piernaArriba);
    piernaArriba->setPosition(1.5,-1.5,0);
    piernaArriba->setScale(0.5,0.5,0.5);
    piernaArriba->roll(Radian(Math::PI/6.0)); // Z

    SceneNode* piernaAbajo = mSceneMgr->createSceneNode(PIERNA_ABAJO);
    Entity *entpiernaAbajo = mSceneMgr->createEntity(PIERNA_ABAJO, CUBE_MESH);
    piernaAbajo->attachObject(entpiernaAbajo);
    piernaArriba->addChild(piernaAbajo);
    piernaAbajo->roll(Radian(Math::PI/2.0)); // Z
    piernaAbajo->setPosition(3,-1,0);

    SceneNode* brazoIzquierdo = mSceneMgr->createSceneNode(BRAZO_IZQUIERDO);
    Entity *entbrazoIzquierdo = mSceneMgr->createEntity(BRAZO_IZQUIERDO, CUBE_MESH);
    brazoIzquierdo->attachObject(entbrazoIzquierdo);
    tronco->addChild(brazoIzquierdo);
    brazoIzquierdo->setPosition(-2.5,0.5,1.5);
    brazoIzquierdo->setScale(0.5,1,0.5);
    brazoIzquierdo->roll(-Radian(Math::PI/2.5));

    SceneNode* brazoDerecho = mSceneMgr->createSceneNode(BRAZO_DERECHO);
    Entity *entbrazoDerecho = mSceneMgr->createEntity(BRAZO_DERECHO, CUBE_MESH);
    brazoDerecho->attachObject(entbrazoDerecho);
    tronco->addChild(brazoDerecho);
    brazoDerecho->setPosition(-2.5,1,-1.5);
    brazoDerecho->setScale(0.5,1,0.5);
    brazoDerecho->roll(-Radian(Math::PI/1.5));

    SceneNode* cabeza = mSceneMgr->createSceneNode(CABEZA);
    Entity *entcabeza = mSceneMgr->createEntity(CABEZA, CUBE_MESH);
    cabeza->attachObject(entcabeza);
    tronco->addChild(cabeza);
    cabeza->setPosition(0,1.5,0);
    cabeza->setScale(0.8,0.4,0.8);
    cabeza->roll(-Radian(Math::PI/6));

    SceneNode* baseSombrero = mSceneMgr->createSceneNode(BASE_SOMBRERO);
    Entity *entbaseSombrero = mSceneMgr->createEntity(BASE_SOMBRERO, CUBE_MESH);
    baseSombrero->attachObject(entbaseSombrero);
    cabeza->addChild(baseSombrero);
    baseSombrero->setPosition(0,1.5,0);
    baseSombrero->setScale(2,0.1,2);
    baseSombrero->roll(-Radian(Math::PI/10));

    SceneNode* sombrero = mSceneMgr->createSceneNode(SOMBRERO);
    Entity *entsombrero = mSceneMgr->createEntity(SOMBRERO, CUBE_MESH);
    sombrero->attachObject(entsombrero);
    baseSombrero->addChild(sombrero);
    sombrero->setPosition(0,6,0);
    sombrero->setScale(0.6,6,0.6);

  }
};

int main(void) {
  SimpleExample example;
  example.go();
  
  return 0;
}
